例题讲解
原文链接:https://www.anquanke.com/post/id/171283
1 | 用pwnable.tw里面的secret_of_my_heart作为例题 |
1 | 该程序有三个功能 |
1 | 分别是add、delete和show功能。 |
1 | 这里的mmap出的内存里面主要作用是用来存放一个个secret结构体 |
1 | 下面看一下add函数 |
1 | 漏洞点在add函数中的input_str函数中 |
1 | 红框中的代码有泄露漏洞,可以泄露堆的地址 |
1 | 再看一下delete函数中的内容: |
1 | 1、可以通过unsortedbin attack写入到free_hook上方,然后利用fastbin attack写入system的地址,从而拿到shell; |
具体实现
1 | 第一种思路的实现 |
1 | 这是exp中的各个函数 |
1 | 然后进行chunk overlap |
1 | 可以看到,这里已经实现了我们的目的。 |
1 | 我们已经将0-4号合并的chunk放到了unsortedbin中,但1号chunk实际上并没有被我们free过,所以我们把在unsortedbin中的0号chunk申请掉,malloc就会切割chunk,并将unsortedbin的地址放到1号chunk里面,这时候我们去show1号chunk就可以得到unsortedbin地址了。 |
1 | 这样我们就可以通过去unsortedbin中取得内存,来控制0x562b0fa38200中的内容了. |
1 | 首先new一个0xE8大小的内存。 |
1 | 然后通过new一块0x70+0x70大小的chunk,控制0x562b0fa38200中的prev_size为0,size为0x71,fd为attack_heap,也就是0x562b0fa382c0 |
1 | 看一下0x562b0fa382c0中的情况 |
1 | 为什么0x562b0fa382c0中为什么回事这样呢,还记得前面吗? |
1 | 这里我们对0x562b0fa382c0写入了p64(0x0)+p64(0x71)+p64(attack_heap)。 |
还有四种方法自行原文学习 ,学一种我就快die了
exp
1 | from pwn import * |